package com.coderdream.chapter03.templatemethod.Sample;

public class StringDisplay extends AbstractDisplay { // StringDisplay也是
	// AbstractDisplay的子类。
	/**
	 * 
	 */
	private String string; // 应输出的字串。
	private int width; // 以byte为单位所求出的字串「宽度」。

	/**
	 * <pre>
	 * 把以构造函数传递过来的字串 string 储存在属性內。 
	 * 接着把以byte为单位的字元宽幅储存在属性，后面会使用到。
	 * </pre>
	 * 
	 * @param string
	 */
	public StringDisplay(String string) { // 
		this.string = string; // 
		this.width = string.getBytes().length;// 
		// 
	}

	
	/** 
	 * <pre>
	 * 先复写后再定义的open方法。
	 * 以此类的方法printLine画出线段。
	 * </pre>
	 * 
	 */
	public void open() {  
		this.printLine(); 
	}

	/**
	 * print方法则在属性所储存的字串前后加上"|"，然后输出到画面。
	 * 
	 */
	public void print() {
		System.out.println("|" + string + "|");
	}

	public void close() { // close方法则同
		this.printLine(); // open，利用printLine方法画出线段。
	}

	private void printLine() { // 这是open和close所调用的printLine方法。
		// 因为这是private，所以只能在此类內部使用。
		System.out.print("+"); // 输出"+"记号表示边框位置。
		for (int i = 0; i < width; i++) { // 输出width个"-"，
			System.out.print("-"); // 当作线段。
		}
		System.out.println("+"); // 输出"+"记号表示边框位置。
	}
}
